// 总结：二维数组传参，函数形参的设计只能省略第一个[]的数字。
// 因为对一个二维数组，可以不知道有多少行，但是必须知道一行多少元素。
// 这样才方便运算。

void test(int arr[3][5]) // ok？  yes
{
} // 传入一个3行5列的数组   直接把形参定义成一个 3 行 5 列的 数组
void test(int arr[][]) // ok？ no
{
} // 形参的二维数组   行可以省略  列 不能省略
void test(int arr[][5]) // ok？
{
} // 形参的二维数组   行可以省略  列 不能省略

// 多维数组传参只能省略第一维

// 数组是首元素地址  二维数组传参也可以写成指针形式

void test(int *arr) // ok？  no
{                   // 形参的类型是指针数组   但传入的是一个地址，需要用指针来接受
} // 二维数组传过去时，传入的是首元素地址，二维数组的首元素地址是    第一行的地址
// 二位数组的数组名，表示首元素的地址，实际上是第一行的地址  是一个一维数组的地址
//  一维数组的地址 不能放入在一个一维指针里面
void test(int *arr[5]) // ok？   yes
{
} // int *arr[5]   这是一个数组，里面有五个元素，每个元素是int*   可以放得下传入的一维数组
void test(int (*arr)[5]) // ok？ yes
{
} // int (*arr)[5] 这是一个指针  指向一个可以存下五个 整形元素 的 数组
void test(int **arr) // ok？ no
{
} // 传入的是一维数组，一维数组的地址 不能放在二级指针中
int main()
{
    int arr[3][5] = {0};
    test(arr);
}
